/**
 ******************************************************************************
 * @file           : bsp_dht11.h
 * @brief          : DHT11 Temperature and Humidity Sensor Driver (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * DHT11温湿度传感器驱动头文件
 * 单总线通信协议
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_DHT11_H
#define __BSP_DHT11_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief DHT11错误码枚举
 */
typedef enum
{
    DHT11_OK = 0,               /*!< 成功 */
    DHT11_ERROR_PARAM,          /*!< 参数错误 */
    DHT11_ERROR_TIMEOUT,        /*!< 超时 */
    DHT11_ERROR_CHECKSUM,       /*!< 校验和错误 */
    DHT11_ERROR_NOT_INIT        /*!< 未初始化 */
} DHT11_Error_e;

/**
 * @brief DHT11数据结构体
 */
typedef struct
{
    uint8_t humidity_int;       /*!< 湿度整数部分 */
    uint8_t humidity_dec;       /*!< 湿度小数部分 */
    uint8_t temperature_int;    /*!< 温度整数部分 */
    uint8_t temperature_dec;    /*!< 温度小数部分 */
    uint8_t checksum;           /*!< 校验和 */
} DHT11_RawData_t;

/**
 * @brief DHT11处理后的数据结构体
 */
typedef struct
{
    float humidity;             /*!< 湿度（%RH） */
    float temperature;          /*!< 温度（°C） */
} DHT11_Data_t;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/**
 * @brief       DHT11初始化
 *
 * @param       无
 *
 * @retval      DHT11_Error_e - 错误码
 *
 * @note        初始化GPIO和定时器
 */
DHT11_Error_e dht11_init(void);

/**
 * @brief       DHT11反初始化
 *
 * @param       无
 *
 * @retval      无
 *
 * @note        关闭GPIO和定时器
 */
void dht11_deinit(void);

/**
 * @brief       读取DHT11温湿度
 *
 * @param[out]  data - 数据结构体指针
 *
 * @retval      DHT11_Error_e - 错误码
 *
 * @note        读取温度和湿度
 */
DHT11_Error_e dht11_read(DHT11_Data_t *data);

/**
 * @brief       只读取温度
 *
 * @param[out]  temperature - 温度指针
 *
 * @retval      DHT11_Error_e - 错误码
 *
 * @note        无
 */
DHT11_Error_e dht11_read_temperature(float *temperature);

/**
 * @brief       只读取湿度
 *
 * @param[out]  humidity - 湿度指针
 *
 * @retval      DHT11_Error_e - 错误码
 *
 * @note        无
 */
DHT11_Error_e dht11_read_humidity(float *humidity);

/**
 * @brief       打印DHT11状态
 *
 * @param       无
 *
 * @retval      无
 *
 * @note        用于调试
 */
void dht11_print_status(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DHT11_H */
